package com.sport.web.controller.system;

import java.util.*;
import javax.servlet.http.HttpServletResponse;

import com.sport.common.core.domain.entity.SysDept;
import com.sport.system.domain.SportItem;
import com.sport.system.domain.vo.DeptRankingVo;
import com.sport.system.domain.vo.SportItemUserVo;
import com.sport.system.domain.vo.SportItemUserVo2;
import com.sport.system.service.ISportItemService;
import com.sport.system.service.ISysDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.sport.common.annotation.Log;
import com.sport.common.core.controller.BaseController;
import com.sport.common.core.domain.AjaxResult;
import com.sport.common.enums.BusinessType;
import com.sport.system.domain.SportItemUser;
import com.sport.system.service.ISportItemUserService;
import com.sport.common.utils.poi.ExcelUtil;
import com.sport.common.core.page.TableDataInfo;

/**
 * 比赛报名Controller
 *
 * @author wyd
 * @date 2022-04-07
 */
@RestController
@RequestMapping("/system/sportApplyUser")
public class SportItemUserController extends BaseController {
    @Autowired
    private ISportItemUserService sportItemUserService;

    @Autowired
    private ISportItemService sportItemService;

    @Autowired
    private ISysDeptService sysDeptService;

    /**
     * 查询比赛报名列表
     */
//    @PreAuthorize("@ss.hasPermi('system:sportApplyUser:list')")
    @GetMapping("/list")
    public TableDataInfo list(SportItemUser sportItemUser) {
        startPage();
        List<SportItemUser> list = sportItemUserService.selectSportItemUserList(sportItemUser);
        ArrayList<Object> objects = new ArrayList<>();
        for (SportItemUser itemUser : list) {
            SportItemUser sportItemUser1 = new SportItemUser();
            SysDept sysDept = sysDeptService.selectDeptById(Long.valueOf(itemUser.getUserDept()));
            sportItemUser1 = itemUser;
            Map<String, Object> params = sportItemUser1.getParams();
            params.put("dept", sysDept);
            objects.add(sportItemUser1);
        }
        return getDataTable(objects);
    }

    /**
     * 计算学院排名情况
     */
    @PostMapping("/deptRanking")
    public TableDataInfo deptList() {
        List<SportItemUser> sportItemUsers = sportItemUserService.selectDeptRanking();
        ArrayList<Object> objects = new ArrayList<>();
        int i = 1;
        for (SportItemUser sportItemUser : sportItemUsers) {
            SysDept sysDept = sysDeptService.selectDeptById(Long.valueOf(sportItemUser.getUserDept()));
            DeptRankingVo deptRankingVo = new DeptRankingVo();
            deptRankingVo.setUserDept(sportItemUser.getUserDept());
            deptRankingVo.setPoints(sportItemUser.getPoints());
            deptRankingVo.setRanking(i);
            Map<String, Object> params = deptRankingVo.getParams();
            params.put("dept", sysDept);
            i++;
            objects.add(deptRankingVo);
        }
        return getDataTable(objects);
    }


    /**
     * 导出比赛报名列表
     */
//    @PreAuthorize("@ss.hasPermi('system:sportApplyUser:export')")
    @Log(title = "比赛报名", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SportItemUser sportItemUser) {
        List<SportItemUser> list = sportItemUserService.selectSportItemUserList(sportItemUser);
        ExcelUtil<SportItemUser> util = new ExcelUtil<SportItemUser>(SportItemUser.class);
        util.exportExcel(response, list, "比赛报名数据");
    }

    /**
     * 获取比赛报名详细信息
     */
//    @PreAuthorize("@ss.hasPermi('system:sportApplyUser:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") String id) {
        return AjaxResult.success(sportItemUserService.selectSportItemUserById(id));
    }

    /**
     * 新增比赛报名
     */
//    @PreAuthorize("@ss.hasPermi('system:sportApplyUser:add')")
    @Log(title = "比赛报名", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody SportItemUser sportItemUser) {
        Date date = new Date();
        // 生成id和当前时间
        sportItemUser.setId(UUID.randomUUID().toString().replace("-", ""));
        sportItemUser.setApplyTime(date);
        // 判断当前报名是否结束
        SportItem sportItem = sportItemService.selectSportItemById(sportItemUser.getItemId());
        if (date.before(sportItem.getItemStardate())) {
            return AjaxResult.error("报名未开始！");
        } else if (date.after(sportItem.getItemEnddate())) {
            return AjaxResult.error("报名已结束！");
        }
        // 获取传来的数据，进行查找
        SportItemUserVo sportItemUserVo = new SportItemUserVo();
        sportItemUserVo.setItemId(sportItemUser.getItemId());
        sportItemUserVo.setUserName(sportItemUser.getUserName());
        List<SportItemUser> sportItemUsers = sportItemUserService.selectSportItemUserByIds(sportItemUserVo);
        for (SportItemUser itemUser : sportItemUsers) {
            if (itemUser.getItemId().equals(sportItemUser.getItemId()) && itemUser.getUserName().equals(sportItemUser.getUserName())) {
                return AjaxResult.error("该项目，你已经报过名了！");
            }
        }
        return toAjax(sportItemUserService.insertSportItemUser(sportItemUser));
    }

    /**
     * 修改比赛报名
     */
//    @PreAuthorize("@ss.hasPermi('system:sportApplyUser:edit')")
    @Log(title = "比赛报名", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody SportItemUser sportItemUser) {
        return toAjax(sportItemUserService.updateSportItemUser(sportItemUser));
    }

    /**
     * 计算比赛排名和积分
     *
     * @param id
     * @return
     */
    @PutMapping("/{id}")
    public AjaxResult editById(@PathVariable("id") String id) {
        SportItemUser sportItemUser = new SportItemUser();
        sportItemUser.setItemId(id);
        SportItem sportItem = sportItemService.selectSportItemById(id);
        int i = 1;
        int z = 0;
        int s = 8;
        // 计算排名和积分
        List<SportItemUser> sportItemUsers = sportItemUserService.selectSportItemUserList(sportItemUser);
        if (sportItem.getItemClassify() == 1) {
            // 用于径赛
            for ( z = sportItemUsers.size()-1; z >= 0 ; z--) {
                sportItemUsers.get(z).setRanking(i);
                if(s == 0) {
                    sportItemUsers.get(z).setPoints(0);
                } else {
                    sportItemUsers.get(z).setPoints(s);
                    s--;
                }
                i++;
                sportItemUserService.updateSportItemUser(sportItemUsers.get(z));
            }
        } else {
            // 用于田赛
            for (SportItemUser itemUser : sportItemUsers) {
                itemUser.setRanking(i);
                if(s == 0) {
                    itemUser.setPoints(0);
                } else {
                    itemUser.setPoints(s);
                    s--;
                }
                i++;
                sportItemUserService.updateSportItemUser(itemUser);
            }
        }

        return new AjaxResult();
    }

    /**
     * 删除比赛报名
     */
//    @PreAuthorize("@ss.hasPermi('system:sportApplyUser:remove')")
    @Log(title = "比赛报名", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable String[] ids) {
        String id = ids[0];
        SportItemUser sportItemUser = sportItemUserService.selectSportItemUserById(String.valueOf(id));
        SportItem sportItem = sportItemService.selectSportItemById(sportItemUser.getItemId());
        Date date = new Date();
        if (date.after(sportItem.getItemEnddate())) {
            return AjaxResult.error("报名结束！数据维护阶段，不可取消报名！");
        }
        return toAjax(sportItemUserService.deleteSportItemUserByIds(ids));
    }
}
